package com.QBsoft.commons.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Formatter;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.io.IOUtils;
import org.springframework.util.StringUtils;

import com.QBsoft.commons.resources.WsResourcesConexion;
import com.QBsoft.test.TestImportTxt;


public   class WsUtil {
	private static final String BLANK_STRING = " ";
	public static final WsUtil WS_UTILS=new WsUtil();
	public static WsUtil getInstance(){
		return WS_UTILS;
	}

	public String getTabSeparatedFile(ArrayList list,Integer colNum) {
		StringBuilder stringBuilder=new StringBuilder();
		FileOutputStream out;
		try {
			String prnt_string = "";
			int k = 0;
			int l = 0;
			int size = list.size();
			int count = size;
			while (size >= 0) {
				for (k = 0; k < colNum; k++) {
					if (l >= count) {
						break;
					}
					prnt_string = getValue(list.get(l), prnt_string);
					l++;
					size--;
				}
				prnt_string = prnt_string + "\r\n";
				stringBuilder.append(prnt_string);
				prnt_string = "";
				if (l >= count) {
					break;
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return stringBuilder.toString();
	}

	public String getValue(Object value, String prnt_string) {
		String formatedValue = "";
		if (value != null && value.toString().trim().length() != 0) {
			String valStrng = value.toString().trim();
			formatedValue = valStrng;
		} else {
			formatedValue = BLANK_STRING;
		}
		prnt_string = prnt_string + formatedValue + "\t";
		return prnt_string;
	}
	public String getConsultaInSql(String cadenaValor){
		List<String> items = Arrays.asList(cadenaValor.split("\\s*,\\s*"));
		StringBuilder  stringBuilder=new  StringBuilder();
		//List<String> itemsComillas =new ArrayList<>();
		int contador=0;
		for(String stringItems:items){
			contador++;
			if(contador!=items.size()){
				stringBuilder.append("'"+stringItems+"',");
			}else{
				stringBuilder.append("'"+stringItems+"'");
			}
		}
		return stringBuilder.toString();
	}
	public String completarConCeros(String campo,int tamanio){
		//Formatter fmt = new Formatter();
		//fmt.format("%0"+tamanio+"d",campo);
		String str2 = String.format("%"+tamanio+"s", campo).replace(' ', '0');
		return str2;
	}
	/**
	 * Metodo para poder obtener las columas  mediante predicados
	 * @param lista
	 * @param idColumna
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public FPedidos buscarPedido(Collection<FPedidos> lista,final String idColumna){
		//creo el predicado para buscar
		Predicate predicate = new Predicate() {
	          public boolean evaluate(Object object) {
	              return ((FPedidos) object).getIdColumna().equals(idColumna);
	          }
	      };
	    FPedidos resultado = CollectionUtils.find(lista,predicate);
		return resultado;
	}
	/**
	 * metodo para poder importar pedido desde un String con tabulaciones
	 * @param fileTab
	 * @return
	 */
	public Collection<FPedidos> obtenerPeditos(String fileTab) throws Exception{
		List<FPedidos> listaPedidos = new ArrayList<>();
		try {
			int contador = 0;
			Scanner scanner = new Scanner(fileTab);
			//recorro el string linea por linea
			while (scanner.hasNextLine()) {
				String linea = scanner.nextLine();
				String[] values = linea.split("\t");
				//caso para leer las cabeceras de los archivos
				if (contador == 0) {
					//recorro toda la primera la fila
					for (String val : values) {
						listaPedidos.add(new FPedidos(val,new ArrayList<String>()));
					}
				// leer los datos de los archivos
				} else {
					int contadorColumna = 0;
					//recorro las filas
					for (String val : values) {
						listaPedidos.get(contadorColumna).getDatosColumna().add(val);
						contadorColumna++;
					}
				}
				contador++;
			}
			scanner.close();
		} catch (Exception ex) {
			throw new Exception("No se pudo importar los pedidos:"+ex.getMessage());
		}
		return listaPedidos;
		  
	  }
	
	
	/**
	 * metodo para poder importar pedido desde un String con tabulaciones
	 * @param fileTab
	 * @return
	 */
	public Collection<FormatoPedidos> obtenerPedidos(String archivoString) throws Exception{
		WsResourcesConexion ws=new WsResourcesConexion();
		Collection<FormatoPedidos> listPedidos=new ArrayList<>();
		try {		      
		      Scanner scanner = new Scanner(archivoString);
		      int contador=0; 
		      while (scanner.hasNextLine()) {
		    	  	boolean agregarLista=Boolean.TRUE;
			    	FormatoPedidos formatoPedidos=new FormatoPedidos();
			    	String linea = scanner.nextLine();
			        String[] values = linea.split("\t");
			        //el archivo tiene cabecera
			        if(ws.getString("veture.conCabecera").equals("1")){
			        	if(contador==0){
			        		agregarLista=Boolean.FALSE;
			        		System.out.println("sin cabecera");
			        	}else{
			        		agregarLista=Boolean.TRUE;
			        	}
			        }
			        if(agregarLista){
			        	formatoPedidos.setCodigo_cli(values[0]);//0
				        formatoPedidos.setCodigo_ven(values[1]);//1
				        formatoPedidos.setCodigo_ciu(values[2]);//2
				        formatoPedidos.setCodigo_cfi(values[3]);//3
				        formatoPedidos.setCodigo_tve(values[4]);//4
				        formatoPedidos.setCodigo_lae(values[5]);//5
				        formatoPedidos.setCodigo_des(values[6]);//6
				        formatoPedidos.setCodigo_aca(values[7]);//7
				        formatoPedidos.setCodigo_log(values[8]);//8
				        formatoPedidos.setFue_cpe(values[9]);//9
				        formatoPedidos.setAwb_cpe(values[10]);//10        
				        formatoPedidos.setFecha_salid_cpe(castFecha(values[11], ws.getString("veture.fecha.formato")));//11
				        formatoPedidos.setCodigo_idp(values[12]);//12
				        formatoPedidos.setOrden_compr_cpe(values[13]);//13
				        formatoPedidos.setManej_preci_cpe(values[14]);//14
				        formatoPedidos.setNumero_cpe(values[15]);//15
				        formatoPedidos.setAwb1_cpe(values[16]);//16
				        formatoPedidos.setCodigo_cpe(values[17]);//17
				        formatoPedidos.setCodigo_edp(values[18]);//18
				        formatoPedidos.setFecha_factu_cpe(castFecha(values[19],ws.getString("veture.fecha.formato")));//19
				        formatoPedidos.setFecha_vuelo_cpe(castFecha(values[20],ws.getString("veture.fecha.formato")));//20
				        
				        formatoPedidos.setHora_entrega_cpe(values[21]);//21
				        formatoPedidos.setFecha_pago_cpe(castFecha(values[22],ws.getString("veture.fecha.formato")));//22
				        formatoPedidos.setObservacion_cpe(values[23]);//23
				        formatoPedidos.setNumero_factur_cpe(values[24]);//24
				        formatoPedidos.setDolar_cpe(values[25].replace(",","."));//25
				        formatoPedidos.setFecha_elabo_cpe(castFecha(values[26],ws.getString("veture.fecha.formato")));//26
				        formatoPedidos.setVuelo_cpe(values[27]);//27
				        formatoPedidos.setCodigo_det(values[28]);//28
				        formatoPedidos.setCodigo_dei(values[29]);//29
				        formatoPedidos.setV_a_codigo_aca(values[30]);//30
				        
				        formatoPedidos.setObservacion1_cpe(values[31]);//31
				        formatoPedidos.setPedid_padre_cpe(values[32]);//32
				        formatoPedidos.setCodigo_ttr(values[33]);//33
				        formatoPedidos.setCodigo_cst(values[34]);//34
				        formatoPedidos.setCodigo_dca(values[35]);//35
				        formatoPedidos.setCodigo_tca(values[36]);//36
				        formatoPedidos.setCodigo_crs(values[37]);//37
				        formatoPedidos.setCantidad_dca(values[38]);//38
				        formatoPedidos.setMarca_dca(values[39]);//39
				        formatoPedidos.setObservacion_dca(values[40]);//40
				        
				        formatoPedidos.setNumero_caja_dca(values[41]);//41
				        formatoPedidos.setCumpl_stock_dca(values[42]);//42
				        formatoPedidos.setFecha_dca(castFecha(values[43],ws.getString("veture.fecha.formato")));//43
				        formatoPedidos.setObservacion_ven(values[44]);//44
				        formatoPedidos.setCodigo1_dca(values[45]);//45
				        formatoPedidos.setCodigo2_dca(values[46]);//46
				        formatoPedidos.setS_s_codigo_suc(values[47]);//47
				        formatoPedidos.setCodigo_tpe(values[48]);//48
				        formatoPedidos.setCodigo_dbu(values[49]);//49
				        formatoPedidos.setCodigo_cpr(values[50]);//50
				        
				        formatoPedidos.setCodigo_upo(values[51]);//51
				        formatoPedidos.setCantidad_dbu(values[52]);//52
				        formatoPedidos.setPrecio_dbu(values[53].replace(",","."));//53
				        formatoPedidos.setPrecio1_dbu(values[54].replace(",","."));//54
				        formatoPedidos.setDolar_dbu(values[55].replace(",","."));//55
				        formatoPedidos.setCumpl_stock_dbu(values[56]);//56
				        formatoPedidos.setObservacio_dbu(values[57]);//57
				        formatoPedidos.setNuevo_dbu(values[58]);//58
				        formatoPedidos.setAlterno_dbu(values[59]);//59
				        formatoPedidos.setObservacio1_dbu(values[60]);//60
				        
				        formatoPedidos.setCodigo_dbs(values[61]);//61
				        formatoPedidos.setCodigo_dta(values[62]);//62
				        formatoPedidos.setCodigo_var(values[63]);//63
				        formatoPedidos.setCantidad_dta(values[64]);//64
				        formatoPedidos.setPrecio_dta(values[65].replace(",","."));//65
				        formatoPedidos.setPrecio1_dta(values[66].replace(",","."));//66
				        formatoPedidos.setCodigo_tbu(values[67]);//67
				        formatoPedidos.setCodigo_lon(values[68]);//68
				        formatoPedidos.setCodigo_upo(values[69]);//69
				        formatoPedidos.setCodigo_car(values[70]);//70
				        
				        formatoPedidos.setCodigo_cal(values[71]);//71
				        formatoPedidos.setCodigo_pco(values[72]);//72
				        formatoPedidos.setCodigo_tbo(values[73]);//73
				        formatoPedidos.setCodigo_nta(values[74]);//74
				        formatoPedidos.setCodigo_eve(values[75]);//75
				        formatoPedidos.setNombre_cpr(values[76]);//76
				        formatoPedidos.setEstandar_cpr(values[77]);//77
				        formatoPedidos.setCodigo2_cpr(values[78]);//78
				        formatoPedidos.setNombre1_cpr(values[79]);//79
				        formatoPedidos.setE_u_codigo_upo(values[80]);//80
				        
				        formatoPedidos.setEs_base_dpr(values[81]);//81
				        formatoPedidos.setCodigo_var(values[82]);//82
				        formatoPedidos.setV_c_codigo_ciu(values[83]);//83
				        formatoPedidos.setCodigo_lge(values[84]);//84
				        formatoPedidos.setCodigo_comp(values[85]);//85
				        formatoPedidos.setCodigo_suc(values[86]);//86
				        formatoPedidos.setCodigo_vec(values[87]);//87
				        formatoPedidos.setCodigo_tpd(values[88]);//88
				        formatoPedidos.setCodigo_mon(values[89]);//89
				        formatoPedidos.setTipo_cambio_cpe(values[90]);//90
				        formatoPedidos.setOrderId(values[91]);
				        formatoPedidos.setShipmentId(values[92]);
				        formatoPedidos.setPesoBruto(values[93].replace(",","."));
				        formatoPedidos.setPesoNeto(values[94].replace(",","."));
				        
				        listPedidos.add(formatoPedidos);
			        }
			        contador++;
			        
			        
		      }
		      scanner.close();
		    
			} catch (Exception ex) {
		    	throw new Exception("No se pudo importar los pedidos:"+ex.getMessage());
		    }
		return listPedidos;
	 }
	/**
	 * devuelve una fecha  en string en el formato necesario de (yyyy-MM-dd)
	 * @param Fecha
	 * @return
	 */
	public String stringToDate(String fecha,String formato){
		String resultado="";
		try {
			Date date;
			date = new SimpleDateFormat("yyyy-MM-dd").parse(fecha);
			DateFormat df = new SimpleDateFormat(formato);
			resultado=df.format(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultado;
	}
	public String castFecha(String fecha,String formato){
		String resultado="";
		if (!fecha.isEmpty()){
			resultado=stringToDate(fecha, formato);
		}return resultado;
		
	}
	public void ordenarFormatoPedido(List<FormatoPedidos> list){
		Comparator<FormatoPedidos> comparator=new Comparator<FormatoPedidos>() {
			public int compare(FormatoPedidos c1, FormatoPedidos c2) {
				Integer uno=Integer.parseInt(c1.getCodigo_dca());
				Integer dos=Integer.parseInt(c2.getCodigo_dca());
				return (uno).compareTo(dos);
		        //return c1.getCodigo_dca().compareTo(c2.getCodigo_dca()); // use your logic
		    }
		};
		Collections.sort(list, comparator);
		System.out.println("Lista ordenada correctamente");
	}
}
